package com.outstanding.his.util.pager;

import java.util.ArrayList;
import java.util.List;

/**
 * 与具体ORM实现无关的分页参数及查询结果封装. 注意所有序号从1开始.
 * 
 * @param <T>
 *            Page中记录的类型.
 * 
 */

public class Pagination {

	// 分页参数 //
	private int pageNo = 1; // 当前页码
	private int pageSize = 1; // 每页的记录数
	private long firstIndex = 0; // 当前页第一条数据在List中的位置,从0开始
	private long totalPages = 0; // 总页数。
	private long totalCount = -1; // 总行数。
	private Object object; // 当前页中存放的记录,类型一般为List

	/**
	 * 构造方法，只构造空页.
	 */
	@SuppressWarnings("unchecked")
	public Pagination() {
		this(0, 0, 5, new ArrayList());
	}
	
	@SuppressWarnings("unchecked")
	public Pagination(int pageSize) {
		this(0, 0,pageSize, new ArrayList());
	}

	/**
	 * 默认构造方法.
	 * 
	 * @param start
	 *            本页数据在数据库中的起始位置
	 * @param totalSize
	 *            数据库中总记录条数
	 * @param pageSize
	 *            本页容量
	 * @param data
	 *            本页包含的数据
	 */
	public Pagination(long firstIndex, int totalCount, int pageSize, Object object) {
		this.pageSize = pageSize;
		this.firstIndex = firstIndex;
		this.totalCount = totalCount;
		this.object = object;
	}

	// 查询参数访问函数 //

	/**
	 * 获得当前页的页号,序号从1开始,默认为1.
	 */
	public int getPageNo() {
		return pageNo;
	}

	/**
	 * 设置当前页的页号,序号从1开始,低于1时自动调整为1.
	 */
	public void setPageNo(final int pageNo) {
		this.pageNo = pageNo;

		if (pageNo < 1) {
			this.pageNo = 1;
		}
	}

	/**
	 * 获得每页的记录数量,默认为1.
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 设置每页的记录数量,低于1时自动调整为1.
	 */
	public void setPageSize(final int pageSize) {
		this.pageSize = pageSize;

		if (pageSize < 1) {
			this.pageSize = 1;
		}
	}

	// 访问查询结果函数 //

	public long getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(final long totalCount) {
		this.totalCount = totalCount;
	}

	/**
	 * 根据pageSize与totalCount计算总页数, 默认值为-1.
	 */
	public long getTotalPages() {
		if (totalCount < 0)
			return -1;

		long count = totalCount / pageSize;
		if (totalCount % pageSize > 0) {
			count++;
		}
		return count;
	}

	public void setTotalPages(long totalPages) {
		this.totalPages = totalPages;
	}

	/**
	 * 是否还有下一页.
	 */
	public boolean isHasNext() {
		return (pageNo + 1 <= getTotalPages());
	}

	/**
	 * 取得下页的页号, 序号从1开始. 当前页为尾页时仍返回尾页序号.
	 */
	public int getNextPage() {
		if (isHasNext())
			return pageNo + 1;
		else
			return pageNo;
	}

	/**
	 * 是否还有上一页.
	 */
	public boolean isHasPre() {
		return (pageNo - 1 >= 1);
	}

	/**
	 * 取得上页的页号, 序号从1开始. 当前页为首页时返回首页序号.
	 */
	public int getPrePage() {
		if (isHasPre())
			return pageNo - 1;
		else
			return pageNo;
	}

	/**
	 * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.
	 */
	
	public int getFirstIndex() {
		return ((pageNo - 1) * pageSize) + 1;
	}
	
	public Object getObject() {
		return object;
		
	}

	/**
	 * 取得最后的位置
	 * 
	 * @author froglv
	 */

	public long getEndIndex() {
		int endNum = getFirstIndex() + pageSize - 1;
		if (totalCount != -1 && endNum > totalCount) {
			return  totalCount;
		}
		return endNum;
	}
	

	/**
	 * 获取任一页第一条数据在数据集的位置.
	 *
	 * @param pageNo   从1开始的页号
	 * @param pageSize 每页记录条数
	 * @return 该页第一条数据
	 */
	public static int getFirstIndex(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}
}
